ν¬κ΄μ μΈ κ°μ΄λλ₯Ό ν΅ν΄ μλ°μ€ν¬λ¦½νΈ μ½λ 리뷰λ₯Ό λ§μ€ν°νμΈμ. κΈλ‘λ² νλ‘μ νΈμ μ½λ νμ§, μ μ§λ³΄μμ±, ν νμ μ κ°μ νκΈ° μν λͺ¨λ² μ¬λ‘, κΈ°λ², λꡬλ₯Ό λ°°μ°μΈμ.
μλ°μ€ν¬λ¦½νΈ μ½λ 리뷰: ν₯μλ νμ§ λ³΄μ¦μ μν λͺ¨λ² μ¬λ‘
μ€λλ λΉ λ₯΄κ² λ³ννλ μννΈμ¨μ΄ κ°λ° νκ²½, νΉν λ€μν μκ°λμ λ¬Ένμ κ±Έμ³ μλ κΈλ‘λ² νμμλ λμ μ½λ νμ§μ μ μ§νλ κ²μ΄ 무μλ³΄λ€ μ€μν©λλ€. νλ μΉ κ°λ°μ μ΄μμΈ μλ°μ€ν¬λ¦½νΈλ μ λ’°μ±, μ μ§λ³΄μμ± λ° μ±λ₯μ 보μ₯νκΈ° μν΄ μ격ν μ½λ 리뷰 κ΄νμ μꡬν©λλ€. μ΄ ν¬κ΄μ μΈ κ°μ΄λλ μλ°μ€ν¬λ¦½νΈ μ½λ 리뷰λ₯Ό μν λͺ¨λ² μ¬λ‘λ₯Ό νꡬνμ¬, νμ΄ μ½λ νμ§μ λμ΄κ³ κ΅μ μ μΈ κ²½κ³λ₯Ό λμ΄ νμ μ κ°μνν μ μλλ‘ μ§μν©λλ€.
μλ°μ€ν¬λ¦½νΈ μ½λ λ¦¬λ·°κ° μ€μν μ΄μ λ 무μμΌκΉμ?
μ½λ 리뷰λ λ¨μν λ²κ·Έλ₯Ό μ°Ύλ κ² μ΄μμ λλ€. μ§μ 곡μ λ₯Ό μ΄μ§νκ³ , μ½λ© νμ€μ κ°μ νλ©°, μ λ°μ μΈ μ½λ νμ§μ ν₯μμν€λ νμ κ³Όμ μ λλ€. νΉν λ€μκ³Ό κ°μ μ¬λ¬ κ°μ§ μ΄μ λ‘ μλ°μ€ν¬λ¦½νΈ κ°λ°μμ λ§€μ° μ€μν©λλ€:
- μ΄κΈ° λ¨κ³μμ μ€λ₯ κ°μ§: κ°λ° μ£ΌκΈ° μ΄κΈ°μ, μ¦ νλ‘λμ μ λ°°ν¬λκΈ° μ μ λ²κ·Έμ μ μ¬μ μΈ λ¬Έμ λ₯Ό μλ³νλ©΄ μκ°κ³Ό 리μμ€λ₯Ό μ μ½ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, κ°κ³Όλ λ²κ·Έ λλ¬Έμ νΌν¬ μΈμΌ κΈ°κ° λμ μ€μν μ μ μκ±°λ κΈ°λ₯μ΄ μ€ν¨νλ μλ리μ€λ₯Ό μμν΄ λ³΄μΈμ. μ½λ 리뷰λ₯Ό ν΅ν μ‘°κΈ° λ°κ²¬μ μ΄λ¬ν λΉμ©μ΄ λ§μ΄ λλ μν©μ μλ°©ν μ μμμ΅λλ€.
- μ½λ κ°λ μ± λ° μ μ§λ³΄μμ± ν₯μ: μ½λλ₯Ό μ΄ν΄νκ³ μ μ§λ³΄μνκΈ° μ½κ² λ§λ€λ©΄ μλ‘μ΄ λ²κ·Έ λ°μ μνμ μ€μ΄κ³ ν₯ν κ°λ° μμ μ λ¨μνν μ μμ΅λλ€. μ ꡬ쑰νλκ³ λ¬Έμνλ μ½λλ² μ΄μ€λ μλ‘μ΄ νμ(μλ§λ λ€λ₯Έ μ§μμμ ν©λ₯ν)μ΄ νμ νκ³ κΈ°μ¬νκΈ°κ° λ μ½μ΅λλ€.
- μ½λ© νμ€ κ°μ : μ 체 μ½λλ² μ΄μ€μ κ±Έμ³ μΌκ΄λ μ½λ© μ€νμΌμ μ μ§νλ©΄ κ°λ μ±μ΄ ν₯μλκ³ μΈμ§ λΆνκ° μ€μ΄λλλ€. μ΄λ κ°λ°μλ€μ΄ μλ‘ λ€λ₯Έ μ½λ© μ νΈλλ λ°°κ²½μ κ°μ§ μ μλ κΈλ‘λ² λΆμ° νκ³Ό μμ ν λ νΉν μ€μν©λλ€. ESLint μ¬μ©κ³Ό κ°μ νμ€μ κ°μ νλ©΄ κ°μΈμ μ€νμΌμ κ΄κ³μμ΄ μΌκ΄μ±μ 보μ₯ν μ μμ΅λλ€.
- μ§μ 곡μ λ° ν νμ : μ½λ 리뷰λ νμ κ°μ μ§μκ³Ό λͺ¨λ² μ¬λ‘λ₯Ό 곡μ ν μ μλ νλ«νΌμ μ 곡ν©λλ€. μ£Όλμ΄ κ°λ°μλ μλ ¨λ λλ£λ‘λΆν° λ°°μΈ μ μκ³ , μλμ΄ κ°λ°μλ μλ‘μ΄ κ΄μ μ μ»μ μ μμ΅λλ€. μ΄λ¬ν νλ ₯μ νμ΅ νκ²½μ μ§μμ μΈ κ°μ λ¬Ένλ₯Ό μ‘°μ±ν©λλ€. μλ₯Ό λ€μ΄, μΈλμ μλμ΄ κ°λ°μκ° λ―Έκ΅μ μ£Όλμ΄ κ°λ°μμκ² μ΅μ ν κΈ°λ²μ 곡μ ν μ μμ΅λλ€.
- 보μ μ·¨μ½μ : ν΄λΌμ΄μΈνΈμ μλ² μμͺ½μμ μ€νλλ μλ°μ€ν¬λ¦½νΈλ 보μ 곡격μ λΉλ²ν νμ μ΄ λ©λλ€. μ½λ 리뷰λ κ΅μ°¨ μ¬μ΄νΈ μ€ν¬λ¦½ν (XSS)μ΄λ SQL μΈμ μ κ³Ό κ°μ μ μ¬μ μ·¨μ½μ μ μλ³νκ³ μ μ©λλ κ²μ λ°©μ§ν μ μμ΅λλ€. μ μΈκ³μ μΌλ‘ μ§μλ§λ€ λ°μ΄ν° κ°μΈ μ 보 λ³΄νΈ κ·μ μ΄ λ€λ¦ λλ€. μ½λ 리뷰λ κ·μ μ€μλ₯Ό 보μ₯νλ λ° λμμ΄ λ μ μμ΅λλ€.
ν¨κ³Όμ μΈ μλ°μ€ν¬λ¦½νΈ μ½λ 리뷰λ₯Ό μν λͺ¨λ² μ¬λ‘
1. λͺ νν μ½λ© νμ€ λ° κ°μ΄λλΌμΈ μ립
μ½λ 리뷰 νλ‘μΈμ€λ₯Ό μμνκΈ° μ μ λͺ ννκ³ ν¬κ΄μ μΈ μ½λ© νμ€κ³Ό κ°μ΄λλΌμΈμ μ μνλ κ²μ΄ μ€μν©λλ€. μ΄λ¬ν νμ€μ λ€μκ³Ό κ°μ μΈ‘λ©΄μ λ€λ£¨μ΄μΌ ν©λλ€:
- μ΄λ¦ μ§μ κ·μΉ: λ³μ, ν¨μ, ν΄λμ€, νμΌμ μ΄λ¦ μ§μ κ·μΉμ μ립ν©λλ€. μΌκ΄λ μ΄λ¦ μ§μ μ μ½λλ₯Ό λ μ½κ² μ΄ν΄νκ³ μ μ§λ³΄μν μ μκ² λ§λλλ€. μλ₯Ό λ€μ΄, λ³μμλ camelCaseλ₯Ό, ν΄λμ€μλ PascalCaseλ₯Ό μ¬μ©ν©λλ€.
- μ½λ μμ: λ€μ¬μ°κΈ°, 곡백, μ€ λ°κΏμ λν κ·μΉμ μ μν©λλ€. Prettierμ κ°μ λꡬλ₯Ό μ¬μ©νλ©΄ μ΄λ¬ν κ·μΉμ λ°λΌ μ½λλ₯Ό μλμΌλ‘ ν¬λ§·ν μ μμ΅λλ€.
- μ£Όμ μ²λ¦¬: μ½λμ μ£Όμμ μΆκ°ν μκΈ°μ λ°©λ²μ λͺ μν©λλ€. μ£Όμμ μ½λμ λͺ©μ , λ‘μ§, κ·Έλ¦¬κ³ κ°μ μ΄λ μ ν μ¬νμ μ€λͺ ν΄μΌ ν©λλ€.
- μ€λ₯ μ²λ¦¬: μ€λ₯ λ° μμΈλ₯Ό μ²λ¦¬νλ λ°©λ²μ μ μν©λλ€. try-catch λΈλ‘μ μ¬μ©νμ¬ μ μ¬μ μ€λ₯λ₯Ό μ²λ¦¬νκ³ μ μ©ν μ€λ₯ λ©μμ§λ₯Ό μ 곡ν©λλ€.
- 보μ: eval() μ¬μ© ννΌ, μ¬μ©μ μ λ ₯ μλνμ΄μ¦, κ΅μ°¨ μ¬μ΄νΈ μ€ν¬λ¦½ν (XSS) λ° κ΅μ°¨ μ¬μ΄νΈ μμ² μμ‘°(CSRF) 곡격 λ°©μ΄μ κ°μ 보μ λͺ¨λ² μ¬λ‘λ₯Ό κ°λ΅μ μΌλ‘ μ€λͺ ν©λλ€.
- μ±λ₯: λΆνμν 루ν νΌνκΈ°, DOM μ‘°μ μ΅μ ν, μΊμ± μ λ΅ μ¬μ© λ± ν¨μ¨μ μΈ μ½λλ₯Ό μμ±νκΈ° μν κ°μ΄λλΌμΈμ μ 곡ν©λλ€.
μ΄λ¬ν νμ€μ λ¬Έμνλμ΄ λͺ¨λ νμμ΄ μ½κ² μ κ·Όν μ μμ΄μΌ ν©λλ€. μ€νμΌ κ°μ΄λ μμ±κΈ°λ₯Ό μ¬μ©νμ¬ μ λ¬Έμ μ΄κ³ μ μ§λ³΄μνκΈ° μ¬μ΄ μ€νμΌ κ°μ΄λλ₯Ό λ§λλ κ²μ κ³ λ €ν΄ λ³΄μΈμ. ESLintμ Prettier κ°μ λꡬλ₯Ό ꡬμ±νμ¬ μ΄λ¬ν νμ€μ μλμΌλ‘ κ°μ ν μ μμ΅λλ€.
2. μ μ λΆμ λ° λ¦°ν μ μν μλν λꡬ μ¬μ©
μλνλ λꡬλ μ½λ 리뷰μ ν¨μ¨μ±κ³Ό ν¨κ³Όλ₯Ό ν¬κ² ν₯μμν¬ μ μμ΅λλ€. ESLint, JSHint, JSLintμ κ°μ μ μ λΆμ λꡬλ μ μ¬μ μ€λ₯, μ½λ μ€νμΌ μλ°, 보μ μ·¨μ½μ μ μλμΌλ‘ κ°μ§ν μ μμ΅λλ€. μ΄λ¬ν λꡬλ μ½λ© νμ€κ³Ό λͺ¨λ² μ¬λ‘λ₯Ό κ°μ νλλ‘ κ΅¬μ±νμ¬ μ½λλ² μ΄μ€ μ λ°μ κ±Έμ³ μΌκ΄μ±μ 보μ₯ν μ μμ΅λλ€.
λ¦°ν λꡬλ λν μ μλ μ½λ© νμ€μ λ°λΌ μ½λλ₯Ό μλμΌλ‘ ν¬λ§·νμ¬ λ¦¬λ·° μ€ μλ μ½λ ν¬λ§·ν μ νμμ±μ μ€μΌ μ μμ΅λλ€. κΈλ‘λ² νμ κ²½μ°, μ΄λ¬ν μλνλ λ€λ₯Έ μ§μμ κ΄νμμ λΉλ‘―λ μ μλ μ€νμΌμ λν λ Όμμ νΌνλ λ° μ€μν©λλ€.
ESLint μ€μ μμ (.eslintrc.js):
module.exports = {
env: {
browser: true,
es2021: true,
node: true,
},
extends: [
'eslint:recommended',
'plugin:react/recommended',
'plugin:@typescript-eslint/recommended',
'prettier',
],
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaFeatures: {
jsx: true,
},
ecmaVersion: 12,
sourceType: 'module',
},
plugins: ['react', '@typescript-eslint', 'prettier'],
rules: {
'prettier/prettier': 'error',
'no-unused-vars': 'warn',
'react/prop-types': 'off',
},
};
μ΄λ¬ν λꡬλ€μ ν리-μ»€λ° ν (pre-commit hook)μ΄λ CI/CD νμ΄νλΌμΈκ³Ό κ°μ κ°λ° μν¬νλ‘μ°μ ν΅ν©νλ©΄, μ½λκ° μ»€λ°λκ±°λ λ°°ν¬λκΈ° μ μ μλμΌλ‘ κ²μ¬λλλ‘ λ³΄μ₯ν μ μμ΅λλ€.
3. μ κΈ°μ μΈ μ½λ 리뷰 μν
μ½λ 리뷰λ κ°λ° κ³Όμ μ μΌλΆλ‘μ μ κΈ°μ μΌλ‘ μνλμ΄μΌ ν©λλ€. λͺ¨λ μ½λκ° λ©μΈ μ½λλ² μ΄μ€μ λ³ν©λκΈ° μ μ 리뷰νλ κ²μ λͺ©νλ‘ νμΈμ. μ μμΌ κ°λ°μμλ μ΄κ²μ΄ μ’ μ’ νΉμ κΈ°λ₯μ΄λ λ²κ·Έ μμ κ³Ό κ΄λ ¨λ μ½λλ₯Ό 리뷰νλ κ²μ μλ―Έν©λλ€.
λ€μκ³Ό κ°μ μ κ·Ό λ°©μμ κ³ λ €ν΄ λ³΄μΈμ:
- νμ΄ νλ‘κ·Έλλ°: λ λͺ μ κ°λ°μκ° κ°μ μ½λμ λν΄ ν¨κ» μμ νλ©°, ν λͺ μ μ½λλ₯Ό μμ±νκ³ λ€λ₯Έ ν λͺ μ μ€μκ°μΌλ‘ 리뷰ν©λλ€.
- ν 리νμ€νΈ 리뷰: κ°λ°μλ€μ μμ μ μ½λ λ³κ²½ μ¬νμ ν 리νμ€νΈλ‘ μ μΆνκ³ , μ΄λ λ€λ₯Έ νμλ€μ μν΄ λ¦¬λ·°λ ν λ©μΈ μ½λλ² μ΄μ€μ λ³ν©λ©λλ€. μ΄λ GitHub, GitLab, Bitbucketκ³Ό κ°μ νλ«νΌμμ μΌλ°μ μΈ κ΄νμ λλ€.
- μ κΈ° μ½λ 리뷰 νμ: νμ΄ μ κΈ°μ μΌλ‘ λͺ¨μ¬ μ½λλ₯Ό ν¨κ» 리뷰ν©λλ€. μ΄λ 볡μ‘νκ±°λ μ€μν μ½λ λ³κ²½ μ¬νμ λ Όμνλ μ’μ λ°©λ²μ΄ λ μ μμ΅λλ€.
κΈλ‘λ² λΆμ° νμ κ²½μ°, ν 리νμ€νΈλ₯Ό μ¬μ©ν λΉλκΈ°μ μ½λ λ¦¬λ·°κ° μ’ μ’ κ°μ₯ μ€μ©μ μΈ μ κ·Ό λ°©μμ΄λ©°, λ€λ₯Έ μκ°λμ κ°λ°μλ€μ΄ κ°μ νΈν μκ°μ μ½λλ₯Ό 리뷰ν μ μκ² ν΄μ€λλ€. GitHubμ μ½λ 리뷰 κΈ°λ₯μ²λΌ μ½λ μ μ₯μμ μ§μ ν΅ν©λλ λꡬλ νλ‘μΈμ€λ₯Ό κ°μνν©λλ€.
4. λ²κ·Έ μ°ΎκΈ°λΏλ§ μλλΌ μ½λ νμ§μ μ§μ€νκΈ°
μ½λ 리뷰λ λ¨μν λ²κ·Έλ₯Ό μ°Ύλ κ² μ΄μμ μ΄μ μ λ§μΆ°μΌ ν©λλ€. κ°λ μ±, μ μ§λ³΄μμ±, μ±λ₯, 보μμ ν¬ν¨ν μ½λμ μ λ°μ μΈ νμ§μ νκ°ν΄μΌ ν©λλ€. λ€λ₯Έ μ¬λ(μ μ¬μ μΌλ‘ λ€λ₯Έ λ¬ΈνκΆ μΆμ μ΄κ±°λ λ€λ₯Έ μΈμ΄ λ₯λ ₯μ κ°μ§)μ΄ λ―Έλμ μ½λλ₯Ό μ΄ν΄νκ³ μμ νκΈ°κ° μΌλ§λ μ¬μΈμ§ μκ°ν΄ 보μΈμ.
μ½λλ₯Ό 리뷰ν λ λ€μκ³Ό κ°μ μ§λ¬Έμ νμΈμ:
- μ½λλ₯Ό μ΄ν΄νκΈ° μ¬μ΄κ°?
- μ½λκ° μ λ¬Έμνλμ΄ μλκ°?
- μ½λκ° μ립λ μ½λ© νμ€μ λ°λ₯΄λκ°?
- μ½λκ° ν¨μ¨μ μ΄κ³ μ±λ₯μ΄ μ’μκ°?
- μ½λκ° μμ νκ°?
- μ½λλ₯Ό λ κ°λ¨νκ±°λ μ°μν λ°©μμΌλ‘ μμ±ν μ μλκ°?
건μ€μ μΈ νΌλλ°±κ³Ό κ°μ μ μμ μ 곡νμΈμ. λ¨μν λΉνν기보λ€λ μ μκ° μ½λλ₯Ό κ°μ νλλ‘ λλ λ° μ§μ€νμΈμ. μ견μ μ§μκ° μλ μ§λ¬Έμ΄λ μ μμ ννλ‘ νννμΈμ. μλ₯Ό λ€μ΄, "μ΄ μ½λλ λΉν¨μ¨μ μ΄λ€"λΌκ³ λ§νλ λμ "λ€λ₯Έ μκ³ λ¦¬μ¦μ μ¬μ©νμ¬ μ΄ μ½λλ₯Ό μ΅μ νν μ μμκΉμ?"λΌκ³ λ§ν΄λ³΄μΈμ.
5. μ½λ 리뷰μ 체ν¬λ¦¬μ€νΈ μ¬μ©νκΈ°
체ν¬λ¦¬μ€νΈλ₯Ό μ¬μ©νλ©΄ μ½λμ λͺ¨λ μ€μν μΈ‘λ©΄μ΄ κ²ν λλλ‘ λ³΄μ₯νλ λ° λμμ΄ λ μ μμ΅λλ€. 체ν¬λ¦¬μ€νΈλ λ€μκ³Ό κ°μ μΈ‘λ©΄μ λ€λ£¨μ΄μΌ ν©λλ€:
- κΈ°λ₯μ±: μ½λκ° μλν κΈ°λ₯μ μ¬λ°λ₯΄κ² μννλκ°?
- μ€λ₯ μ²λ¦¬: μ½λκ° μ€λ₯μ μμΈλ₯Ό μ μμ μΌλ‘ μ²λ¦¬νλκ°?
- 보μ: μ½λμ μ μ¬μ μΈ λ³΄μ μ·¨μ½μ μ΄ μλκ°?
- μ±λ₯: μ½λκ° ν¨μ¨μ μ΄κ³ μ±λ₯μ΄ μ’μκ°?
- κ°λ μ±: μ½λλ₯Ό μ΄ν΄νκΈ° μ¬μ΄κ°?
- μ μ§λ³΄μμ±: μ½λλ₯Ό μ μ§λ³΄μνκΈ° μ¬μ΄κ°?
- ν μ€νΈ μ©μ΄μ±: μ½λλ₯Ό ν μ€νΈνκΈ° μ¬μ΄κ°?
- μ½λ μ€νμΌ: μ½λκ° μ립λ μ½λ© νμ€μ λ°λ₯΄λκ°?
- λ¬Έμν: μ½λκ° μ λ¬Έμνλμ΄ μλκ°?
체ν¬λ¦¬μ€νΈλ νΉμ νλ‘μ νΈμ κΈ°μ μ€νμ λ§κ² μ‘°μ λμ΄μΌ ν©λλ€. μλ₯Ό λ€μ΄, 리μ‘νΈ μ ν리μΌμ΄μ μ© μ²΄ν¬λ¦¬μ€νΈμλ μ»΄ν¬λνΈ μ€κ³ λ° μν κ΄λ¦¬μ κ΄λ ¨λ νΉμ νλͺ©μ΄ ν¬ν¨λ μ μμ΅λλ€.
6. μ½λ 리뷰λ₯Ό μ§μ€μ μ΄κ³ κ°κ²°νκ² μ μ§νκΈ°
μ½λ 리뷰λ μ§μ€μ μ΄κ³ κ°κ²°ν΄μΌ ν©λλ€. ν λ²μ λ§μ μμ μ½λλ₯Ό 리뷰νλ κ²μ λΆλ΄μ€λ¬μΈ μ μκ³ κ°κ³Όλ‘ μ΄μ΄μ§ μ μμ΅λλ€. μκ³ κ΄λ¦¬ κ°λ₯ν λ©μ΄λ¦¬λ‘ μ½λλ₯Ό 리뷰νλ κ²μ λͺ©νλ‘ νμΈμ.
κ° μ½λ 리뷰μ λ²μλ₯Ό νΉμ κΈ°λ₯μ΄λ λ²κ·Έ μμ μΌλ‘ μ ννμΈμ. μ΄λ κ² νλ©΄ μ½λλ₯Ό μ΄ν΄νκ³ μ μ¬μ μΈ λ¬Έμ λ₯Ό μλ³νκΈ°κ° λ μ¬μμ§λλ€. μ½λ λ¦¬λ·°κ° λ무 ν¬λ©΄ λ μμ λ¦¬λ·°λ‘ λλμ΄μΌ ν μλ μμ΅λλ€.
λͺ ννκ³ κ°κ²°ν νΌλλ°±μ μ 곡νμΈμ. λͺ¨νΈνκ±°λ μ λ§€ν μ견μ νΌνμΈμ. 무μμ λ³κ²½ν΄μΌ νλμ§μ κ·Έ μ΄μ μ λν΄ κ΅¬μ²΄μ μΌλ‘ μ€λͺ νμΈμ. μμ μ μ€λͺ νκΈ° μν΄ μμλ₯Ό μ¬μ©νμΈμ. κ΅μ νμ κ²½μ°, μ€ν΄λ₯Ό νΌνκΈ° μν΄ λͺ νν μμ¬μν΅μ΄ νΉν μ€μν©λλ€.
7. κ°λ°©μ μΈ μν΅κ³Ό νμ μ₯λ €νκΈ°
μ½λ 리뷰λ κ°λ°©μ μΈ μν΅κ³Ό μ§μ 곡μ λ₯Ό μ₯λ €νλ νμ κ³Όμ μ΄μ΄μΌ ν©λλ€. κ°λ°μλ€μ΄ νΈμνκ² μ§λ¬Ένκ³ νΌλλ°±μ μ 곡ν μ μλ λ¬Ένλ₯Ό λ§λμΈμ.
κ°λ°μλ€μ΄ μ½λ λ³κ²½ μ¬νκ³Ό μ μ¬μ μΈ λ¬Έμ μ λν΄ λ Όμνλλ‘ μ₯λ €νμΈμ. Slackμ΄λ Microsoft Teamsμ κ°μ μ¨λΌμΈ νμ λꡬλ₯Ό μ¬μ©νμ¬ μν΅μ μ΄μ§νμΈμ. νμλ ν λ‘ μ μμ½ν λλ μκ°λ μ°¨μ΄λ₯Ό μΌλμ λμΈμ.
μ§μμ μΈ νμ΅ λ¬Ένλ₯Ό μ₯λ €νμΈμ. κ°λ°μλ€μ΄ μλ‘ μ§μκ³Ό λͺ¨λ² μ¬λ‘λ₯Ό 곡μ νλλ‘ κ²©λ €νμΈμ. μ΄λ μ½λ 리뷰, λ©ν λ§ λλ κ΅μ‘ μΈμ μ ν΅ν΄ μ΄λ£¨μ΄μ§ μ μμ΅λλ€.
8. λ¬Ένμ μ°¨μ΄λ₯Ό μΌλμ λκΈ°
κΈλ‘λ² λΆμ° νκ³Ό μμ ν λλ λ¬Ένμ μ°¨μ΄λ₯Ό μΌλμ λλ κ²μ΄ μ€μν©λλ€. λ¬Ένλ§λ€ μμ¬μν΅ μ€νμΌκ³Ό μ½λ 리뷰 μ κ·Ό λ°©μμ΄ λ€λ₯Ό μ μμ΅λλ€. μ΄λ¬ν μ°¨μ΄λ₯Ό μ‘΄μ€νκ³ κ°μ μ νΌνμΈμ.
μλ₯Ό λ€μ΄, μΌλΆ λ¬ΈνκΆμ νΌλλ°±μ΄ λ μ§μ μ μΌ μ μλ λ°λ©΄, λ€λ₯Έ λ¬ΈνκΆμ λ κ°μ μ μΌ μ μμ΅λλ€. μ΄λ¬ν λ―Έλ¬ν μ°¨μ΄λ₯Ό μΈμ§νκ³ κ·Έμ λ°λΌ μμ¬μν΅ μ€νμΌμ μ‘°μ νμΈμ. λͺ¨λ μ¬λμ΄ μ΄ν΄νμ§ λͺ»ν μ μλ κ΄μ©κ΅¬λ μμ΄ μ¬μ©μ νΌνμΈμ.
λͺ¨λ μ½λ 리뷰μ μν΅μ μμ΄λ 곡μ©μ΄λ₯Ό μ¬μ©νλ κ²μ κ³ λ €ν΄ λ³΄μΈμ. μ΄λ μ€ν΄λ₯Ό νΌνκ³ λͺ¨λ μ¬λμ΄ κ°μ λ΄μ©μ μ΄ν΄νλλ‘ λ³΄μ₯νλ λ° λμμ΄ λ μ μμ΅λλ€.
9. ν μ€νΈ μλν
μλνλ ν μ€νΈλ μλ°μ€ν¬λ¦½νΈ κ°λ°μ μ€μν λΆλΆμΌλ‘, μ½λκ° μμλλ‘ μλνλμ§ νμΈνκ³ νκ·(regression)λ₯Ό λ°©μ§ν©λλ€. μλνλ ν μ€νΈλ₯Ό μ½λ 리뷰 νλ‘μΈμ€μ ν΅ν©νμ¬ μ€λ₯λ₯Ό μ‘°κΈ°μ λ°κ²¬νκ³ μλ‘μ΄ λ²κ·Έ λμ μνμ μ€μ΄μΈμ.
μλνλ ν μ€νΈμ μ’ λ₯:
- λ¨μ ν μ€νΈ: κ°λ³ μ»΄ν¬λνΈλ ν¨μλ₯Ό λ 립μ μΌλ‘ ν μ€νΈν©λλ€.
- ν΅ν© ν μ€νΈ: μλ‘ λ€λ₯Έ μ»΄ν¬λνΈλ λͺ¨λ κ°μ μνΈ μμ©μ ν μ€νΈν©λλ€.
- μ’ λ¨ κ° ν μ€νΈ: μ¬μ©μ κ΄μ μμ μ 체 μ ν리μΌμ΄μ μ ν μ€νΈν©λλ€.
Jest, Mocha, Cypressμ κ°μ λꡬλ₯Ό μ¬μ©νμ¬ μλνλ ν μ€νΈλ₯Ό μμ±νκ³ μ€νν μ μμ΅λλ€. μ΄λ¬ν λꡬλ₯Ό CI/CD νμ΄νλΌμΈμ ν΅ν©νμ¬ μ½λκ° λ³κ²½λ λλ§λ€ μλμΌλ‘ ν μ€νΈλ₯Ό μ€ννμΈμ. μ½λ 컀λ²λ¦¬μ§ λꡬλ μ½λκ° μΆ©λΆν ν μ€νΈλμ§ μμ μμμ μλ³νλ λ° λμμ΄ λ μ μμ΅λλ€. κΈλ‘λ² μ¬μ©μ κΈ°λ°μμ λ λ리 νΌμ§ μ μλ κ΅μ°¨ νλ«νΌ νΈνμ± λ¬Έμ λ₯Ό κ³ λ €νμ¬ μ¬λ¬ λΈλΌμ°μ μ μ΄μ 체μ μμ ν μ€νΈκ° μ€νλλλ‘ νμΈμ.
10. μ½λ 리뷰 νλ‘μΈμ€ λ¬Έμν
리뷰μ΄μ μν κ³Ό μ± μ, μ¬μ©λλ λꡬμ κΈ°μ , μ½λ λ³κ²½ μλ½ λλ κ±°λΆ κΈ°μ€μ ν¬ν¨νμ¬ μ½λ 리뷰 νλ‘μΈμ€λ₯Ό λ¬ΈμννμΈμ. μ΄ λ¬Έμλ λͺ¨λ νμμ΄ μ½κ² μ κ·Όν μ μμ΄μΌ ν©λλ€.
λ¬Έμμλ μ½λ 리뷰 μ€ μ견 λΆμΌμΉλ μΆ©λμ ν΄κ²°νκΈ° μν κ°μ΄λλΌμΈλ ν¬ν¨λμ΄μΌ ν©λλ€. ν λ‘ μ ν΅ν΄ ν΄κ²°ν μ μλ λ¬Έμ μ λν λͺ νν μμ€μ»¬λ μ΄μ νλ‘μΈμ€λ₯Ό μ립νμΈμ.
μ½λ 리뷰 νλ‘μΈμ€κ° ν¨κ³Όμ μ΄κ³ κ΄λ ¨μ±μ μ μ§νλλ‘ μ κΈ°μ μΌλ‘ κ²ν νκ³ μ λ°μ΄νΈνμΈμ. νλ‘μ νΈμ νμ λ³ννλ μꡬμ λ§μΆ° νλ‘μΈμ€λ₯Ό μ‘°μ νμΈμ. μ΄λ μλ‘μ΄ λꡬμ κΈ°μ μ΄ λμμμ΄ λ±μ₯νλ λΉ λ₯΄κ² λ³ννλ κΈ°μ νκ²½μμ νΉν μ€μν©λλ€.
μλ°μ€ν¬λ¦½νΈ μ½λ 리뷰λ₯Ό μ©μ΄νκ² νλ λꡬλ€
λ€μκ³Ό κ°μ μ¬λ¬ λꡬλ€μ΄ μλ°μ€ν¬λ¦½νΈ μ½λ 리뷰 νλ‘μΈμ€λ₯Ό μ©μ΄νκ² ν μ μμ΅λλ€:
- GitHub/GitLab/Bitbucket: μ΄ νλ«νΌλ€μ ν 리νμ€νΈ, μ½λ μ½λ©νΈ, μ½λ 리뷰 μν¬νλ‘μ°μ κ°μ λ΄μ₯ μ½λ 리뷰 κΈ°λ₯μ μ 곡ν©λλ€.
- ESLint/JSHint/JSLint: μ΄λ€μ μ μ¬μ μΈ μ€λ₯, μ½λ μ€νμΌ μλ°, 보μ μ·¨μ½μ μ μλμΌλ‘ κ°μ§ν μ μλ μ μ λΆμ λꡬμ λλ€.
- Prettier: μ μλ μ½λ© νμ€μ λ°λΌ μ½λλ₯Ό μλμΌλ‘ ν¬λ§·ν μ μλ μ½λ ν¬λ§·ν°μ λλ€.
- SonarQube: μ½λ νμ§μ μ§μμ μΌλ‘ κ²μ¬νκΈ° μν νλ«νΌμ λλ€. μ½λ κ²°ν¨, 보μ μ·¨μ½μ , μ½λ μ€λ©μ κ°μ§ν μ μμ΅λλ€.
- CodeClimate: μλνλ μ½λ 리뷰λ₯Ό μν νλ«νΌμ λλ€. μ μ¬μ μΈ λ¬Έμ μ λν΄ μ½λλ₯Ό λΆμνκ³ κ°λ°μμκ² νΌλλ°±μ μ 곡ν μ μμ΅λλ€.
μ¬λ°λ₯Έ λꡬλ₯Ό μ ννλ κ²μ νλ‘μ νΈμ νμ νΉμ μꡬμ λ°λΌ λ¬λΌμ§λλ€. μ½λλ² μ΄μ€μ ν¬κΈ°, μ½λμ 볡μ‘μ±, νμ λꡬ μλ ¨λμ κ°μ μμλ₯Ό κ³ λ €νμΈμ. λν κΈ°μ‘΄ μν¬νλ‘μ° λ° CI/CD νμ΄νλΌμΈκ³Όμ λꡬ ν΅ν©λ κ³ λ €ν΄μΌ ν©λλ€.
κ²°λ‘
μλ°μ€ν¬λ¦½νΈ μ½λ 리뷰λ λμ μ½λ νμ§, μ μ§λ³΄μμ±, μ±λ₯μ 보μ₯νκΈ° μν νμμ μΈ κ΄νμ λλ€. λͺ νν μ½λ© νμ€ μ립, μλνλ λꡬ μ¬μ©, μ κΈ°μ μΈ μ½λ 리뷰 μν, κ°λ°©μ μΈ μν΅μ μ΄μ§ν¨μΌλ‘μ¨ νμ μ½λ νμ§μ ν₯μμν€κ³ νμ μ κ°μνν μ μμ΅λλ€. μ΄λ λͺ νν μμ¬μν΅κ³Ό μΌκ΄λ μ½λ© νμ€μ΄ μ±κ³΅μ μ€μν κΈλ‘λ² νμκ² νΉν μ€μν©λλ€. μ΄ κ°μ΄λμ μμ½λ λͺ¨λ² μ¬λ‘λ₯Ό ꡬνν¨μΌλ‘μ¨ νμ μλ°μ€ν¬λ¦½νΈ κ°λ° κ΄νμ ν₯μμν€κ³ κΈλ‘λ² κ³ κ°μ μꡬλ₯Ό μΆ©μ‘±νλ κ³ νμ§ μννΈμ¨μ΄ μ νμ μ 곡ν μ μμ΅λλ€.
νκ³Ό κΈ°μ μ΄ λ°μ ν¨μ λ°λΌ μ½λ 리뷰 νλ‘μΈμ€λ₯Ό μ§μμ μΌλ‘ μ‘°μ νλ κ²μ κΈ°μ΅νμΈμ. λͺ©νλ λͺ¨λκ° μ΅μμ μ½λλ₯Ό μμ±νλ λ° μ λ νλ μ§μμ μΈ κ°μ λ¬Ένλ₯Ό λ§λλ κ²μ λλ€.